<?php

/*
 * Classe - Modelo - Pai
 * 
 * *Variaveis
 *  $_db ->    ** Variavel de conexão com o banco.
 *  $_tabela -> ** variavel onde armazena os nomes da tabela
 *  $_base -> ** varial onde armazena os demais bancos (schemas).
 *  $_iniFile -> ** Arquivo de configuração do banco de dados.
 * 
 */
    class Model{
     
        protected $_db;
        protected $iniFile = "system/config/conf.ini";
        
        public $_tabela;
        public $_base;
      
/*
 * Contrutor da classe
 * 
 * Retorna a conexão com banco de dados
 * return $_db.
 */
    public function  __construct(){
      
        try{
        $conf = parse_ini_file($this->iniFile);
        $this->_db = new PDO("mysql:host=localhost;dbname=".$conf['base'], $conf['usuario'], $conf['senha'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
        return $this->_db;
        }
        
        catch(PDOException $err) {
               throw new BancoException($err);
               
               }
               
        catch(Exception $err) {
              echo $err;
               
           
            
               
        }    
        
    }
        
        /*Função de inserir no banco
         * 
         * Parametros: $tabela       -  Nome da tabela
         *              array $dados  -  Array onde é armazenados os dados a ser inseridos na tabela,
         *                               Indice do array = nome da coluna do banco.            
         * 
         */
        public function insert(Array $dados ){
          
            $campos = implode(", ", array_keys($dados));
            $valores = "\"".implode("\",\"", array_values($dados))."\"";
           //echo" INSERT INTO `{$this->_tabela}` ({$campos}) VALUES ({$valores}) "; exit(); 
           return $this->_db->query("INSERT INTO `{$this->_tabela}` ({$campos}) VALUES ({$valores}) ");
           }
           
         
        
        
        
        /* Função ler dados do banco
         * 
         * Parametros:     $where = 'Condição' 
         *                 $limit = limite de busca (valores inteiros).
         *                 $offset = ler registros a partir de registros a desejar. 
         *                 $orderby = Ordem crescente ou decrescente
         */
        
        
        
        public function read( $where = null, $limit = null, $offset = null, $orderby = null ){
            
            $where = ($where != null ? "WHERE {$where}" : "");
            $limit = ($limit != null ? "LIMIT {$limit}" : "");
            $offset = ($offset != null ? "OFFSET {$offset}" : "");
            $orderby = ($orderby != null ? "ORDER BY {$orderby}" : "");
            
            
            //echo " SELECT * FROM `{$this->_tabela}` {$where} {$orderby} {$limit} {$offset} "; exit();
            $q = $this->_db->prepare(" SELECT * FROM `{$this->_tabela}` {$where} {$orderby} {$limit} {$offset} ");
            $q->setFetchMode(PDO::FETCH_ASSOC);
            $q->execute();
           
            return $q->fetchAll();
           }
           
           
            public function read_campos( $campos , $where = null, $limit = null, $offset = null, $orderby = null ){
            
            $where = ($where != null ? "WHERE {$where}" : "");
            $limit = ($limit != null ? "LIMIT {$limit}" : "");
            $offset = ($offset != null ? "OFFSET {$offset}" : "");
            $orderby = ($orderby != null ? "ORDER BY {$orderby}" : "");
            
            
            //echo " SELECT * FROM `{$this->_tabela}` {$where} {$orderby} {$limit} {$offset} "; exit();
            $q = $this->_db->prepare(" SELECT $campos FROM `{$this->_tabela}` {$where} {$orderby} {$limit} {$offset} ");
            $q->setFetchMode(PDO::FETCH_ASSOC);
            $q->execute();
           
            return $q->fetchAll();
           }
           
  
        
        /*
         * Função de atualizar dados no banco
         * Parametros: $tabela       -  Nome da tabela
         *              array $dados  -  Array onde é armazenados os dados a ser inseridos na tabela,
         *                               Indice do array = nome da coluna do banco.  
         *             $where = 'Condição' 
         * 
         */

        public function update( $tabela, Array $dados, $where ){
            
            foreach ( $dados as $ind => $val ){
                $campos[] = "{$ind} = \"{$val}\"";
            }
            $campos = implode(", ", $campos);
          // echo "UPDATE `{$tabela}` SET {$campos} WHERE {$where} ";exit();
            return $this->_db->query("UPDATE `{$tabela}` SET {$campos} WHERE {$where} "); 
        }
        /*Sem o safe update mode*/
         public function update_NOsafe_mode( $tabela, Array $dados, $where ){
            
            foreach ( $dados as $ind => $val ){
                $campos[] = "{$ind} = \"{$val}\"";
            }
            $campos = implode(", ", $campos);
            //echo "UPDATE `{$tabela}` SET {$campos} WHERE {$where} ";exit();
            return $this->_db->query("SET SQL_SAFE_UPDATES=0;
                                      UPDATE `{$tabela}` SET {$campos} WHERE {$where};
                                      SET SQL_SAFE_UPDATES=1;"); 
        }

        
        
        /*
         * Função de deletar dados do banco
         * Parametros: $where = 'Condição' 
         * 
         */
        
        public function delete( $where ){
          
            return $this->_db->query("DELETE FROM `{$this->_tabela}` WHERE {$where} ");
        }
        
        /* Ultilitários */
        /*Função que Pega a data e joga no formato MySQl */
    public function converteData($postData){ 
        
     if ($postData == "0000-00-00" || $postData == null ){
         
         $dia =  00;
         $mes =  00;
         $ano =  0000;
         
          $data = array ( $ano , $mes, $dia);
         return implode("-", $data);
         
     }   else {
        
     $separador = explode("-", $postData);
      
         $dia =  $separador[0];
         $mes =  $separador[1];
         $ano =  $separador[2];
      
     $data = array ( $ano , $mes, $dia);
     return implode("-", $data);
           }
     }
     
   }